package com.tracelog.example.config;

import com.tracelog.core.dao.LogRecordDao;
import com.tracelog.core.model.LogRecord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Profile;

/**
 * 日志配置示例
 * <p>演示如何自定义日志存储</p>
 *
 * @author tracelog
 * @since 1.0.0
 */
@Slf4j
@Configuration
public class LogConfig {

    /**
     * 自定义日志存储 - 使用数据库存储（仅演示，不实际存储）
     * 仅在 "db-storage" profile 激活时才会使用此实现
     *
     * @return 日志存储实现
     */
    @Bean
    @Primary
    @Profile("db-storage")
    public LogRecordDao databaseLogRecordDao() {
        return new DatabaseLogRecordDao();
    }

    /**
     * 模拟数据库存储的日志DAO实现
     */
    @Slf4j
    static class DatabaseLogRecordDao implements LogRecordDao {

        @Override
        public void save(LogRecord logRecord) {
            // 实际项目中，这里会将日志保存到数据库
            // 这里仅演示日志格式和流程
            
            StringBuilder sb = new StringBuilder();
            sb.append("\n========== 数据库日志存储模拟 ==========\n");
            sb.append("时间: ").append(logRecord.getStartTime()).append("\n");
            sb.append("模块: ").append(logRecord.getModule()).append("\n");
            sb.append("描述: ").append(logRecord.getDescription()).append("\n");
            sb.append("URI: ").append(logRecord.getMethod()).append(" ").append(logRecord.getUri()).append("\n");
            sb.append("耗时: ").append(logRecord.getExecutionTime().toMillis()).append("ms\n");
            sb.append("IP: ").append(logRecord.getClientIp()).append("\n");
            
            if (logRecord.getExceptionMessage() != null) {
                sb.append("异常: ").append(logRecord.getExceptionMessage()).append("\n");
                if (logRecord.getExceptionStackTrace() != null) {
                    sb.append("堆栈: ").append(logRecord.getExceptionStackTrace()).append("\n");
                }
            }
            
            sb.append("====================================\n");
            
            // 输出到控制台（实际环境中会存储到数据库）
            log.info(sb.toString());
            
            // SQL示例（实际环境中执行）
            String insertSql = "INSERT INTO operation_log(module, description, method, uri, ip, execution_time, start_time, exception) " +
                "VALUES(?, ?, ?, ?, ?, ?, ?, ?)";
            
            log.debug("模拟SQL: {}", insertSql);
            // 实际环境中执行SQL: jdbcTemplate.update(insertSql, params...);
        }
    }
} 